function isUrl(url) {
  // 判断是否为空
  if (!url) {
    return false;
  }

  // 判断是否包含空格
  if (new RegExp('\s', 'g').test(url)) {
    return false;
  }

  // 判断是否以协议开头
  if (!new RegExp('^[a-zA-Z]+:\/\/').test(url)) {
    return false;
  }

  // 判断是否包含域名或IP地址
  if (!new RegExp('[a-zA-Z0-9]+\.[a-zA-Z]{2,}').test(url) && !new RegExp('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}').test(url)) {
    return false;
  }

  // 解析出URL的各个部分
  const parts = new RegExp('^([a-zA-Z]+):\/\/(([^:]+):?([^@]+)@)?([^:\/]+)(:([^\/]+))?([^?#]+)?(\?([^#]+))?(#(.+))?$').exec(url);

  // 判断是否合法URL
  if (!parts) {
    return false;
  }

  // 判断端口号是否合法
  if (parts[7] && isNaN(parseInt(parts[7]))) {
    return false;
  }

  return true;
}

class Request {
  constructor(baseUrl = '', config = {}) {
    this.baseUrl = baseUrl;
    this.config = config;
  }

  request(url, method, options) {
    let baseOptions = {
      dataType: "json",
      responseType: "text",
      header: {}
    };
    Object.assign(baseOptions, this.config);
    Object.assign(baseOptions, options);
    // if (options?.header) Object.assign(baseOptions.header, options.header);
    // 返回一个Promise对象
    return new Promise((resolve, reject) => {
      wx.request({
        ...baseOptions,
        method,
        url: isUrl(url) ? url : (this.baseUrl + url),
        data: options?.data,
        success: res => {
          if (res.statusCode != 200) {
            wx.showModal({
              title: '提示',
              content: '服务器连接失败',
            })
            return reject();
          }
          resolve(res.data)
        },
        fail: error => {
          wx.hideLoading();
          wx.showToast({
            title: '服务器连接失败',
            icon: "none"
          })
          reject(error)
        }
      })
    })
  }

  get(url, options) {
    return this.request(url, 'GET', options)
  }

  put(url, options) {
    return this.request(url, 'PUT', options)
  }

  del(url, options) {
    return this.request(url, 'DELETE', options)
  }

  post(url, options) {
    return this.request(url, 'POST', options)
  }
}

module.exports = Request